package adminlte.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.security.SpringSessionBackedSessionRegistry;

/**
 * 存在redis存储序列化问题, 方法一。
 * RedisHttpSessionConfiguration中已经定义了一个redisOperationsSessionRepository,并且该repo设置的redisTemplate
 * key和hash key的序列化默认采用StringRedisSerializer()
 * @author ZHUFEIFEI
 */
@Slf4j
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {

    /**
     * {@link org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration}
     * 中有RedisOperationsSessionRepository
     * 但是一直存在缺少RedisConnectionFactory的bean问题，这里需要解决Configuration加载先后问题
     * {@link org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration}
     * 中已经有定义RedisConnectionFactory但是，好像在RedisHttpSessionConfiguration之后才执行.
     *<br>
     * 解决方法：配合此配置类，在用到sessionRegistry的autowired成员变量上添加@Lazy注解，延迟注入该bean
     * @param redisOperationsSessionRepository
     * @return
     */
    @Bean
    public SpringSessionBackedSessionRegistry sessionRegistry(RedisOperationsSessionRepository redisOperationsSessionRepository) {
        return new SpringSessionBackedSessionRegistry(redisOperationsSessionRepository);
    }

}
